package udp.dictionary_service;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Arrays;
import java.util.HashMap;

/**
 * 服务器服务
 **/
public class Server {
    private static final HashMap<String,String> map=new HashMap<>();
    static {
        map.put("apple","苹果");
        map.put("banana","香蕉");
    }
    public static void main(String[] args) throws IOException {
        Log.println("服务器开始绑定在8080端口");

        DatagramSocket socket=new DatagramSocket(8080);//绑定到8080端口上
        while(true){
            //服务器循环处理周期-读取请求，处理，发送响应；读取请求，处理，发送响应；...........
            //读取请求
            byte[] buf=new byte[1024];
            DatagramPacket received=new DatagramPacket(buf,buf.length);

            Log.println("服务器准备接收数据");

            socket.receive(received);//服务器会阻塞-等请求过来

            Log.println("服务器接收到了数据");

            //处理
            //对方的地址（ip）
            InetAddress address = received.getAddress();
            Log.printlf("对方的地址是：%s\r\n",address);
            //对方的端口(port)
            int port = received.getPort();
            Log.printlf("对方的端口是：%d\r\n",port);
            //真正收到的数据长度
            int n=received.getLength();//真正收到的数据有多少
            Log.printlf("一共收到的数据长度：%d\r\n",n);
            //真正有用的数据
            byte[] actualData=Arrays.copyOf(buf,n);
            //byte[]+字符集编码->String
            String request=new String(actualData,0, actualData.length,"UTF-8");
            Log.printlf("请求是：%s\r\n",request);
            //分析请求
            if(!request.startsWith("我是Java19班的\r\n")){//startsWith()：以...作为开头
                //不符合应用层的请求协议，不做处理
                Log.println("请求头不符合格式");
                continue;
            }
            if(!request.endsWith("\r\n")){//endsWith()：以...作为结尾/后缀
                //不符合应用层的请求协议，不做处理
                Log.println("请求尾不符合格式");
                continue;
            }
            //把apple截取出来
            String englishWord=request.substring("我是Java19班的\r\n".length(),request.length()-2);
            Log.println("收到的英文单词是"+englishWord);
            //开始提供翻译服务
            String chineseWord=map.getOrDefault(englishWord,"不认识");
            Log.println("翻译后的中文单词是"+chineseWord);
            //发送响应
            String response=String.format("好的\r\n%s\r\n",chineseWord);//把响应组织好
            Log.println("响应是:"+response);
            //String+字符集编码->byte[]
            byte[] bytes = response.getBytes("UTF-8");
            Log.println("准备发送响应");
            DatagramPacket sent=new DatagramPacket(bytes,0,bytes.length,address,port);
            socket.send(sent);//发送出去响应
            Log.println("响应发送成功");
        }
    }
}
